(11)图算法3: 所有节点对最短路径与最大流问题

所有结点对的最短路径问题

Floyd算法

  • 前提条件: 可以有负权重边, 但是不能有负权重的环.
  • 特点: 动态规划, V^3.
  • 按照动态规划的步骤:
    • 最优子结构: d[i][j]表示结点vi至结点vj的最短路径, 而带上了上标d[i][j]<k>表示允许取用v1~vk情况下结点vi至vj的最短路径. 我们可以看出这里存在了一个最优子结构, 因为取用1k的最短路径是在取用1k-1的最短路径和用上k的最短路径之间选取的min.
    • 递归式: d[i][j]<k> = min{ d[i][j]<k-1>, (d[i][k]<k-1>+d[k][j]<k-1>) }. (常规情况, 当k>=1时)
      或者 = w(i, j); (边界情况, 当k=0时) //其中i=j时, 应该w(i, i) = 0; 没有(i, j)边的时候, 为INF;
    • 自底向上计算:
      • 三个循环, i, j, k. k循环是用来算d[i][j]这个格子的min, 总共是一个二维矩阵, 因此要算O(V^3)时间.
Floyd(W) {  //W[V][V]是二维数组, 存放边的权重.
let D[V][V] be a new array, and D = W;
for k = 1~V:
    for i = 1~V:
        for j = 1~V:
            D[i][j] = min{ D[i][j], D[i][k]+D[k][j] };
return D;
}

用于稀疏图的Johnson算法

前提条件: 允许有负权重的环;
特点: 利用G', h(v) = δ(s, v)来为Dijkstra创造无负权重边的条件;

Johnson(G, w) {
compute G':
    G'.V = G.V ∪ {s};
    G'.E = G.E ∪ {(s, v) for all v ∈ G.V}
    w(s, v) = 0 for all v ∈ G.V
if Bellman-Ford(G', w, s) == FALSE: {
    print "The graph contains negative loop;"
    }
else: {
    for each v ∈ G'.V:
        set h(v) = δ(s, v) from Bellman-Ford
    for each edge(u, v)∈G'.E:
        set w'(u, v) = w(u, v) + h(u) - h(v)    //set all weight to non-negative.
    let D = d[][] be n*n matrix
    for each u∈G.V:
        do Dijkstra(G, w', u)
        for each v∈G.V:
            d[u][v] = δ'(u, v) + h(v) - h(u)
    return D matrix
    }
}

算法时间复杂度分析:

Bellman-Ford已知是O(VE) 因为有V-1轮对所有边的操作, Dijkstra是O(ElgV)或者O(VlgV+E), 因为extract-min有V次, decrease-key有E次.
本算法主要时间显然是花在了对所有点进行Dijkstra操作, 显然总时间是O(VElgV) 或者 O(V^2*lgV+VE).

最大流问题

基本方法

Ford-Fulkerson method

Ford-Fulkerson-Method(G, s, t) 
initiate flow f to 0
while there exists an augmenting path p in residual network Gf:
    augment flow f along p
return f

定理

最大流最小割定理

定理: f是G的一个最大流
= 残存网络Gf不再包含任何增广路径
= |f| = c(S, T) , 其中(S, T)是流网络G的某个切割;

  • 说明: 第三行某个切割可以是任意一个切割, 因为流网络具有切割流量相等的性质.

基本款算法

Ford Fulkerson Basic

/* 基本的FF最大流算法 */
// 约定: (u,v).f代表边(u,v)上当前的流量;
// Cf(p)代表path p整条最短路径所允许的残余网络最大流量
// Cf(u, v)代表(u, v)边上的残余网络流量, 本质上是一种潜能(potential)

Ford-Fulkerson(G, s, t)
for each edge (u, v)∈G.E:
    (u, v).f = 0
while there exists an augmenting path p in residual network Gf:
    Cf(p) = min{Cf(u, v): (u,v) is in path p}
    for each edge(u, v) in path p:
        if (u, v) ∈ G.E:
            (u, v).f = (u, v).f + Cf(p)
        else:
            (v, u).f = (v, u).f - Cf(p)
  • 找augmenting path的方法: 用BFS对残存网络Gf进行搜索, 找到一条path;

时间复杂度分析: 算法初始化花费Θ(E), 而while循环的条件如果是用广度优先搜索, 每次要花O(V+E) = O(E), 而循环内求残余容量Cf(p)操作最多有|V-1|条边构成一条最短路径, 因此是O(V), 而接下去对path上所有边的操作, 也是O(V)的. 因为V<=E, 因此单次while循环消耗O(E), 而由我们的关键边上限定理, 可以知道最多有VE条关键边, 每条path至少一条关键边, 因此有O(VE)条path, 因此总时间复杂度为O(V·E^2).

算法的正确性:
为什么使用BFS不断找出最短边(所有边长度设定为1), 可以实现把while循环控制在VE次呢?

先介绍一个基础: δ(s, v)单调递增定理

从源点s到非终点t的某个点v的最短距离总是在递增, 即δ'(s, v) >= δ(s, v). 证明:
反证法: 假设某轮增加流量之后, 存在δ'(s, v)<δ(s, v). 这时, 我们找处于边界v点, 从s到v点的最短路径上, v前面一个点u满足δ'(s, u)=δ(s, u). 已知δ(s, v) <= δ(s, u)+1, δ'(s, u)<=δ'(s, v)+1, δ'(s, v)<=δ(s, v)-1, 那么δ(s, u)+1 >= δ'(s, v)-1, 也就是δ(s, u) >= δ'(s, v)-2与δ'(s, u)<=δ'(s, v)+1是矛盾的.

更加直觉一些地, 随着算法运行, 有些边可能由于流量被加到满导致在残存网络中消失:

  • 如果消失的边在s~v的最短路径上, 显然δ(s, v)将不得不绕别的路, 因而会增加;
  • 如果消失的边不在s~v的最短路径上, 那么也不会影响到δ(s, v).
  • 要认识到, 只有当图中出现了连接之前从未被连接过的两点的新边, 才存在使δ(s, v)下降的可能性.

关键边O(VE)上界的推导:

(u, v)如果第一次被当做最短路径p的关键边话, 会从Gf残存网络图上消失, 此时有δ(s, v) = δ(s, u)+1;
其如果想再次成为关键边, 至少要满足必要条件 (v, u).f 被增加过, 且(u, v)再次被当成最短路径的一部分. (v, u).f要被增加过的话, 那么(v, u)边得被纳入过最短路径, 那么(v, u)满足了δ'(s, u) = δ'(s, v)+1;
已知定理26.7说残存网络中δ(s, v)随着每次流量的递增操作而单调递增 ==> δ'(s, v) >= δ'(s, v), 所以δ'(s, u) = δ'(s, v)+1>=δ(s, v)+1 = δ(s, u)+2.
因此我们得到了一个性质: 当(u, v)边成为一次关键边后, δ(s, u) = δ(s, u)+2, 即关键边递增, 递增的步长为2.
已知从起点s到终点t最短路径最长不能超过V-1, u除了不可能是终点t外, 可以是任何点, 因此(u, v)最多可以当关键边(V-2)/2次, 从而每条边只能当关键边次数 = O(V/2) = O(V), 那么对所有边来说, 最多只能有O(VE)次关键边的出现.
延伸: O(VE)条关键边, 而每个增广路径至少有一条关键边, 因此O(VE)条增广路径.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容